package com.xmut.mall.product.service.impl;

import com.xmut.mall.product.entity.AttrEntity;
import com.xmut.mall.product.entity.SkuInfoEntity;
import com.xmut.mall.product.entity.SpuInfoEntity;
import com.xmut.mall.product.service.AttrService;
import com.xmut.mall.product.service.SkuInfoService;
import com.xmut.mall.product.service.SpuInfoService;
import com.xmut.mall.product.vo.SaleAttrVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xmut.mall.product.utils.PageUtils;
import com.xmut.mall.product.utils.Query;

import com.xmut.mall.product.dao.SkuSaleAttrValueDao;
import com.xmut.mall.product.entity.SkuSaleAttrValueEntity;
import com.xmut.mall.product.service.SkuSaleAttrValueService;


@Service("skuSaleAttrValueService")
public class SkuSaleAttrValueServiceImpl extends ServiceImpl<SkuSaleAttrValueDao, SkuSaleAttrValueEntity> implements SkuSaleAttrValueService {

    @Autowired
    private SkuInfoService skuInfoService;

    @Autowired
    private SkuSaleAttrValueService skuSaleAttrValueService;

    @Autowired
    private AttrService attrService;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<SkuSaleAttrValueEntity> page = this.page(
                new Query<SkuSaleAttrValueEntity>().getPage(params),
                new QueryWrapper<SkuSaleAttrValueEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * 通过spuId获取商品销售分组（颜色和存储）
     *
     * @param spuId
     * @return
     */
    @Cacheable(value = "skuSaleAttrValue",key = "#root.methodName+#root.args[0]")
    @Override
    public List<SkuSaleAttrValueEntity> getSkuSaleAttrValueBySpuId(Long spuId) {
        // 查询该spu对应的sku商品
        List<SkuInfoEntity> skus = skuInfoService.list(new QueryWrapper<SkuInfoEntity>().eq("spu_id", spuId));
        // 获取这些sku的id
        List<Long> skuIds = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
        // 使用这些id查询要的sku销售熟悉
        return skuSaleAttrValueService.list(new QueryWrapper<SkuSaleAttrValueEntity>().in("sku_id",skuIds));
    }

    /**
     * 根据分类id与skuId获取商品详情页选项卡结构
     * @param cateId
     * @param skuId
     * @return
     */
    @Cacheable(value = "SkuSaleAttrValue",key = "#root.methodName+#root.args[0]+#root.args[1]+#root.args[2]")
    @Override
    public List<SaleAttrVo> getSkuSaleAttrValueByCateId(Long cateId, Long skuId,Long spuId) {
        // 先查出你这个商品所属分组的销售属性 attr_type=0
        List<AttrEntity> saleAttr = attrService.list(new QueryWrapper<AttrEntity>()
                .eq("catelog_id", cateId)
                .eq("attr_type",0));
        // 查询当前spu对应的全部的sku信息 并把他们变成id集合
        List<SkuInfoEntity> skus = skuInfoService.list(new QueryWrapper<SkuInfoEntity>().eq("spu_id", spuId));
        List<Long> skuIds = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());


        List<SaleAttrVo> vos = saleAttr.stream().map(item -> {
            //要收集的对象
            SaleAttrVo vo = new SaleAttrVo();
            vo.setTitle(item.getAttrName());
            // 收集具体的属性
            // 查询attrid是当前这个标题的并且把他所有sku的信息都挖出来
            List<SkuSaleAttrValueEntity> skuSaleAttrValues = this.baseMapper.selectList(new QueryWrapper<SkuSaleAttrValueEntity>()
                    .select("distinct attr_value")
                    .eq("attr_id", item.getAttrId())
                    .in("sku_id", skuIds));
            // 将刚才的到的数据进行去重
//            List<SkuSaleAttrValueEntity> distinctSkuSaleAttrValues = skuSaleAttrValues.stream().distinct().collect(Collectors.toList());

            List<SaleAttrVo.SelectRow> rows = skuSaleAttrValues.stream().map(values -> {
                SaleAttrVo.SelectRow row = new SaleAttrVo.SelectRow();
                row.setAttrValue(values.getAttrValue());
                // 查询这个 attrvalue所对应的全部skuid
                List<Long> attrSkuIds = this.baseMapper.selectList(new QueryWrapper<SkuSaleAttrValueEntity>()
                                .eq("attr_value", values.getAttrValue()))
                        .stream()
                        .map(SkuSaleAttrValueEntity::getSkuId).collect(Collectors.toList());
                row.setSkuIds(attrSkuIds);
                return row;
            }).collect(Collectors.toList());

            vo.setValues(rows);
            return vo;
        }).collect(Collectors.toList());
        return vos;
    }


}